package main

import (
	"fmt"
	"math/rand/v2"
)

// / 注意: 数组是值类型，复制和传参都会复制整个数组，建议使用slice或数组指针
func main() {

	// 数组初始化
	var arr0 [5]int = [5]int{1, 2, 3}            // 为初始化元素为0
	var arr1 = [...]int{1, 2, 3, 4, 5}           // 自动确定数组长度
	var arr2 = [5]string{3: "Hello", 4: "World"} // 使用索引号初始化元素
	var arr3 = [...]struct {
		name string
		age  uint8
	}{
		{"user1", 10},
		{"user2", 20}, // 最后一行有逗号
	}

	// [1 2 3 0 0] [1 2 3 4 5] [   Hello World] [{user1 10} {user2 20}]
	fmt.Println(arr0, arr1, arr2, arr3)

	// 多维数组
	var arrMulti = [2][3]int{{1, 2, 3}, {3, 4, 5}}
	fmt.Println(arrMulti)

	// 遍历: 下标遍历或range遍历, 内置函数len和cap都返回数组长度（元素数量）
	for i := 0; i < len(arr0); i++ {
		fmt.Printf("索引%d: 值%d\n", i, arr0[i])
	}

	for i, e := range arr0 {
		fmt.Printf("索引%d: 值%d\n", i, e)
	}

	// 拷贝与传参: 值拷贝行为会造成性能问题，通常建议使用slice或指针
	var arr01 [5]int
	printArr(&arr01)

	arr02 := [...]int{1, 2, 3, 4, 5}
	printArr(&arr02)
}

func printArr(arr *[5]int) {
	fmt.Printf("%p \n", arr)
	arr[0] = 100
	for i, v := range arr {
		fmt.Println(i, v)
	}

	var nums [10]int
	for i := 0; i < 10; i++ {
		nums[i] = rand.IntN(100)
	}
	fmt.Println(nums)
	fmt.Println(sumArr(nums))
}

func sumArr(arr [10]int) int {
	var sum = 0
	for _, v := range arr {
		sum += v
	}
	return sum
}
